package exam.huawei.string;

import java.util.Scanner;

/**
 * 代码编译器
 *
 * 某公司为了更高效的编写代码，邀请你开发一款代码编辑器程序.
 * 程序的输入为:已有的代码文本和指令序列，程序需输出编辑后的最终文本。
 * 指针初始位置位于文本的开头。支持的指令(X为大于等于0的整数,word 为无空格的字符串):
 * <p>
 * 。FORWARD X 指针向前(右)移动X,如果指针移动位置超过了文本末尾，则将指针移动到文本末尾。
 * 。BACKWARD X 指针向后(左)移动X,如果指针移动位置超过了文本开头，则将指针移动到文本开头
 * 。SEARCH-FORWARD word 从指针当前位置向前查找 word 并将指针移动到word的起始位置，如果未找到则保持不变。
 * 。SEARCH-BACKWARD word 在文本中向后查我 word 并将指针移动到word的起始位置，如果末找到则保持不变。
 * 。INSERT word 在指针当前位置前插入word，并将指针移动到word的结尾
 * 。REPLACE word 在指针当前位置替换并插入字符(删除原有字符，并增加新的字符)
 * 。DELETE X 在指针位置删除X个字符
 * <p>
 * 输入描述：
 * 输入的第一行为命令列表的长度K
 * 输入的第二行为文件中的原始文本
 * 接下来的K行，每行为一个指令
 */
public class Example02 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        // 拿到指令的条数
        int k = Integer.parseInt(sc.nextLine());

        // 拿到文本的内容
        StringBuilder s = new StringBuilder(sc.nextLine());

        // 拿到指令（可能有多条，用二维数组来装）
        String[][] commands = new String[k][2];
        for (int i = 0; i < k; i++) {
            commands[i] = sc.nextLine().split(" ");
        }

        System.out.println(getResult(s, commands));
    }

    public static String getResult(StringBuilder s, String[][] commands) {
        int curIdx = 0;

        // command[1]是每条指令的第二个内容，即操作内容
        // 每条指令都要经过一次执行，所以用循环来处理
        for (String[] command : commands) {
            switch (command[0]) {
                case "FORWARD":
                    curIdx += Integer.parseInt(command[1]);
                    // 防止游标越界，挪到文本末尾
                    curIdx = Math.min(curIdx, s.length());
                    break;
                case "BACKWARD":
                    curIdx -= Integer.parseInt(command[1]);
                    // 防止游标越界，挪到文本开头
                    curIdx = Math.max(curIdx, 0);
                    break;
                case "SEARCH-FORWARD":
                    int i = s.indexOf(command[1], curIdx);
                    if (i != -1) curIdx = i;
                    break;
                case "SEARCH-BACKWARD":
                    int i1 = s.lastIndexOf(command[1], curIdx);
                    if (i1 != -1) curIdx = i1;
                    break;
                case "INSERT":
                    s.insert(curIdx, command[1]);
                    curIdx += command[1].length();
                    break;
                case "REPLACE":
                    s.replace(curIdx, curIdx + command[1].length(), command[1]);
                    break;
                case "DELETE":
                    s.delete(curIdx, curIdx + Integer.parseInt(command[1]));
                    break;
            }
        }

        return s.toString();
    }
}
